% Copyright 2012 Beatrice Florat, beatrice.florat <at> googlemail <dot> com

% This file is part of Einfacher Chunk Parser.

% Einfacher Chunk Parser is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.

% Einfacher Chunk Parser is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.

% You should have received a copy of the GNU General Public License
% along with Einfacher Chunk Parser. If not, see <http://www.gnu.org/licenses/>.


:- consult('Parser.pl').
:- consult('Tripel.pl').
:- consult('Einlesen.pl').


% test(+Zahl) :-
%   Zahl ist ein Eingabeparameter, und ruft den Text auf,
%   teilt den Text in Chunks und gibt diese aus.

test(Zahl) :-
   text(Zahl,Text),
   write(' Text  : '), write(Text), nl,
   chunk_parse_text(Text).


% test(+TextListe) :-
%   Text ist ein Eingabeliste,
%   teilt den Text in Chunks und gibt diese aus.

test(TextListe) :-
   is_list(TextListe),
   chunk_parse_text(TextListe).


% test(+Zahl, -Tripel) :-
%   erweitert test/1 um die Ausgabe als Tripel-Struktur.

test(Zahl,Tripel) :-
   text(Zahl,Text),
   write(' Text  : '), write(Text), nl,
   chunk_parse_text(Text,Chunks),
   write(' Chunks: '), write(Chunks), nl,
   tripel_struct(Chunks,Tripel,ZeitStruct),
   write(' Tripel: '), write(Tripel), nl,
   write(' Zeit  : '), write(ZeitStruct), nl.


% test(+TextListe, -Tripel) :-
%  wie test/2, statt einer Zahl wird eine Textliste erwartet

test(Text,Tripel) :-
   is_list(Text),
   write(' Text  : '), write(Text), nl,
   chunk_parse_text(Text,Chunks),
   write(' Chunks: '), write(Chunks), nl,
   tripel_struct(Chunks,Tripel,ZeitStruct),
   write(' Tripel: '), write(Tripel), nl,
   write(' Zeit:   '), write(ZeitStruct), nl.


% test(+Zahl, -Chunks, -Tripel) :-
%   Zahl ist ein Eingabeparameter,
%   ruft den entsprechenden Text auf,
%   gibt die Liste der Chunks und die Struktur der
%   Tripel zurueck

test(Zahl,Chunks,Tripel,ZeitStruct) :-
   text(Zahl,Text),
   chunk_parse_text(Text,Chunks),
   tripel_struct(Chunks,Tripel,ZeitStruct),!.


% test_alle :-
%   ruft alle Texte in text/2 mit chunk_parse_text/2
%   und zeit_struct/2 auf,
%   vergleicht die vom Programm zurueckgegebenen Chunks
%   und Tripeln mit denen von Hand ermittelten,
%   gibt dies in einer Tabelle aus mit der Textzahl und dem
%   Wert true oder false

test_alle :-
   testsaetze(0,41).

testsaetze(Obergrenze,Obergrenze) :- !.

testsaetze(Zahl,Obergrenze) :-
   Zahl1 is Zahl + 1,
   text(Zahl1,Text),
   write(' Text  : '), write(Text), nl,
   chunk_parse_text(Text,Chunks),
   write(' Chunks: '), write(Chunks), nl,
   zeit_struct(Chunks,Tripel),
   write(' Tripel: '), write(Tripel), nl,nl,!,
   testsaetze(Zahl1,Obergrenze).


% testprogramm :-
%   vergleicht die vom Programm ermittelten gesamten Beispielsaetze
%   mit denen der von Hand ermittelten,
%   gibt eine Tabelle aus mit der entsprechenden Zahl
%   und dem Wert true bzw. false

testprogramm :-
   write('Testfall   Chunk     Tripel'),nl,
   write('--------   -----     ------'),nl,
   textdaten(1,42,RC,0,RT,0), % es gibt 41 Testsaetze
   nl, 
   write(' GESAMT: '), nl,
   write(' ------- '), nl,
   write('  Chunks: '), write(RC), write(' von 41 richtig '), nl,
   write('  Tripel: '), write(RT), write(' von 41 richtig '), nl.


% textdaten(+Zahl, +Obergrenze) :-
%   ruft das Praedikat vergleich/3 auf,
%   zaehlt den Eingabeparameter Zahl rekursiv um eins hoch,
%   bis zum Eingabeparameter Obergrenze

% Sonderfall: Obergrenze ist erreicht
textdaten(Obergrenze,Obergrenze,RC,RC,RT,RT):- !. 

% rekursiver Aufruf
textdaten(Zahl,Obergrenze,RichtigeChunks,AkkC,RichtigeTripel,AkkT) :-
   ((Zahl < 10, tab(3)) ; tab(2)),
   write(Zahl),tab(8),
   vergleich(Zahl,Chunkwert,Tripelwert,RC,RT),!,
   Zahl1 is Zahl + 1,  
   AkkC2 is AkkC + RC, AkkT2 is AkkT + RT,
   write(Chunkwert),tab(7),write(Tripelwert),nl,
   textdaten(Zahl1,Obergrenze,RichtigeChunks,AkkC2,RichtigeTripel,AkkT2).

textdaten(Zahl,Obergrenze,RichtigeChunks,AkkC,RichtigeTripel,AkkT) :-
   tab(2),write(Zahl),tab(8),
   vergleich(Zahl,Chunkwert,Tripelwert,RC,RT),!,
   Zahl1 is Zahl + 1,  
   AkkC2 is AkkC + RC, AkkT2 is AkkT + RT,
   write(Chunkwert),tab(7),write(Tripelwert),nl,
   textdaten(Zahl1,Obergrenze,RichtigeChunks,AkkC2,RichtigeTripel,AkkT2).


% vergleich(+Zahl, -Chunkwert, -Tripelwert) :-
%   Zahl ist der Eingabeparameter des Beispielsatzes,
%   vergleicht die ermittelten Chunks und Tripel
%   mit den per Hand erfassten,
%   gibt den Wert true bzw. false in Chunkwert und 
%   Tripelwert zurueck

vergleich(Zahl, Chunkwert, Tripelwert,RC,TC) :-
   chunk_vergleich(Zahl,Chunkwert,RC),
   tripel_vergleich(Zahl,Tripelwert,TC).


% chunk_vergleich(+Zahl, -Chunkwert) :-
%   Zahl ist der Eingabeparameter des Beispielsatzes,
%   vergleicht die ermittelten Chunks mit den
%   per Hand erfassten Chunks aus dem Beispielsatz

% gibt true zurueck, wenn die Chunklisten gleich sind
chunk_vergleich(Zahl,true,1) :-
   text(Zahl,Text),
   chunk_parse_text(Text, Chunks),
   loesung(Zahl, chunk, Chunks).

% restliche Chunkvergleiche sind false
chunk_vergleich(_,false,0).


% tripel_vergleich(+Zahl, -Tripelwert) :-
%   Zahl ist der Eingabeparameter des Beispielsatzes,
%   vergleicht die ermittelte Tripelstruktur mit der
%   per Hand erfasste Tripelstruktur aus dem Beispielsatz

% gibt true zurueck, wenn die Strukturen in Tripel gleich sind
tripel_vergleich(Zahl,true,1) :-
   text(Zahl,Text),
   chunk_parse_text(Text,Chunks),
   zeit_struct(Chunks, Tripel),
   loesung(Zahl, tripel, Tripel).

% restliche Tripelvergleiche sind false
tripel_vergleich(_,false,0).




% Testtexte
% *********
% intransitive Verben
text( 1, [er,geht]).
text( 2, [john,geht]).
text( 3, [die,katze,schlaeft]).

% transitive Verben
text( 4, [ich,trinke,den,kaffee]).
text( 5, [der,vater,trinkt,den,grossen,kaffee]).
text( 6, [mein,grosser,bruder,trinkt,den,sehr,heissen,sehr,grossen,schwarzen,kaffee]).

% Passiv
text( 7, [ein,kaffee,wird,von,mir,getrunken]).

% zwei Nominativergaenzungen
text( 8, [ihr,enkel,wird,lehrer]).

% zwei Akkusativergaenzungen
text( 9, [der,lehrer,lehrt,uns,das,einmaleins]).

% Dativergaenzung
text(10, [sie,antwortet,ihrem,vater]).

% Dativ- und Akkusativergaenzungen
text(11, [der,vater,bringt,der,mutter,einen,kaffee]).
text(12, [der,vater,bringt,ihn,der,mutter]).

% Genitivattribut
text(13, [das,ist,johns,freund]).
text(14, [die,mutter,trinkt,den,kaffee,des,vaters]).

% Praepositionalergaenzung und Akkusativ
text(15, [der,vater,wartet,auf,den,kaffee]).

% Praepositionalergaenzung und Dativ
text(16, [der,kaffee,gehoert,zu,dem,vater]).

% Mehrere Praepositionalergaenzungen
text(17, [der,vater,spricht,mit,seinem,sohn,ueber,guten,kaffee]).

% trennbare Verben
text(18, [die,familie,kauft,kaffee,ein]).

% Perfekt
text(19, [er,hat,den,kaffee,gekocht]).

% Praeteritum
text(20, [er,ging]).

% Plusquamperfekt
text(21, [er,hatte,den,kaffee,gekocht]).

% Futur I
text(22, [er,wird,den,kaffee,kochen]).

% Futur II
text(23, [er,wird,den,kaffee,gekocht,haben]).

% fehlende Worte im Lexikon
text(24, [vater,gibt,tochter,kaffee]).

% Rechtschreibfehler
text(25, [mien,grosser,bruder,drinkt,den,seer,hiessen,seer,groessen,swarzen,kafe]).
text(26, [mien,grosser,bruder,trinkt,den,seer,hiessen,seer,groessen,swarzen,kafe]).

% Grammatikfehler
% falsche Diathese
text(27, [ich,werde,schon,geholfen]).
% falscher Kasus
text(28, [das,liegt,an,den,winter]).
% falscher Genus
text(29, [das,enkel,wird,eine,lehrer]).
% falsche Kongruenz
text(30, [ihr,enkel,wirst,lehrer]).
text(31, [ihr,enkel,und,sein,sohn,wirst,lehrer]).

% Weglassen von Worten
text(32, [mein,grosser,bruder,trinkt,den,sehr,heissen,sehr,schwarzen,kaffee]).
text(33, [mein,grosser,bruder,trinkt,den,sehr,sehr,kaffee]).
text(34, [mein,trinkt,den,kaffee]).
text(35, [meiner,trinkt,den,kaffee]).

% Nominalphrasen
text(36, [der,junge]).
text(37, [john,doe]).

% Adjektivphrasen
text(38, [klein]).

% Praepositionalphrasen
text(39, [vor,dem,winter]).
text(40, [von,dem,winter,an]).
text(41, [eine,woche,vor,dem,winter]).


% Loesungen per Hand
% ******************
% intransitive Verben
loesung( 1, chunk, [chunk(np(pronoun(personal(er)))), chunk(vp(v(geht)))]).
loesung( 1, tripel, gehen(fw(er),'_',praesens)).

loesung( 2, chunk, [chunk(np(namen(first_name(john)))), chunk(vp(v(geht)))]).
loesung( 2, tripel, gehen(john,'_',praesens)).

loesung( 3, chunk, [chunk(np(d(def(die)), namen(appellativ(katze)))),chunk(vp(v(schlaeft)))]).
loesung( 3, tripel, schlafen(katze,'_',praesens)).

% transitive Verben
loesung( 4, chunk, [chunk(np(pronoun(personal(ich)))), chunk(vp(v(trinke))), chunk(np(d(def(den)), n(kaffee)))]).
loesung( 4, tripel, trinken(fw(ich), kaffee,praesens)).

loesung( 5, chunk, [chunk(np(d(def(der)), n(vater))), chunk(vp(v(trinkt))), chunk(np(d(def(den)), adjp(adj(grossen)), n(kaffee)))]).
loesung( 5, tripel, trinken(vater, kaffee(grossen),praesens)).

loesung( 6, chunk, [chunk(np(d(poss(mein)), adjp(adj(grosser)), n(bruder))),chunk(vp(v(trinkt))),chunk(np(d(def(den)), adjp(degree(sehr), adj(heissen)),adjp(degree(sehr), adj(grossen)), adjp(adj(schwarzen)),n(kaffee)))]).
loesung( 6, tripel, trinken(bruder([mein, grosser]),kaffee([sehr, heissen, sehr, grossen, schwarzen]),praesens)).

% Passiv
loesung( 7, chunk, [chunk(np(d(indef(ein)), n(kaffee))), chunk(vp(v(wird))),chunk(pp(p(von), np(pronoun(personal(mir))))),chunk(vp(infinit(partizip(getrunken))))]).
loesung( 7, tripel, getrunken(kaffee, von(fw(mir)),passiv)).

% zwei Nominativergaenzungen
loesung( 8, chunk, [chunk(np(d(poss(ihr)), n(enkel))), chunk(vp(v(wird))),chunk(np(n(lehrer)))]).
loesung( 8, tripel, werden(enkel(ihr), lehrer,praesens)).

% zwei Nominativergaenzungen
loesung( 9, chunk, [chunk(np(d(def(der)), n(lehrer))), chunk(vp(v(lehrt))),chunk(np(pronoun(personal(uns)))),chunk(np(d(def(das)), n(einmaleins)))]).
loesung( 9, tripel, lehren(lehrer, (fw(uns), einmaleins),praesens)).

% Dativergaenzung
loesung(10, chunk, [chunk(np(pronoun(personal(sie)))), chunk(vp(v(antwortet))),chunk(np(d(poss(ihrem)), n(vater)))]).
loesung(10, tripel, antworten(fw(sie), vater(ihrem),praesens)).

% Dativ- und Akkusativergaenzungen
loesung(11, chunk,  [chunk(np(d(def(der)), n(vater))), chunk(vp(v(bringt))),chunk(np(d(def(der)), n(mutter))),chunk(np(d(indef(einen)), n(kaffee)))]).
loesung(11, tripel, bringen(vater, (mutter, kaffee),praesens)).

loesung(12, chunk,  [chunk(np(d(def(der)), n(vater))), chunk(vp(v(bringt))),chunk(np(pronoun(personal(ihn)))),chunk(np(d(def(der)), n(mutter)))]).
loesung(12, tripel, bringen(vater, (fw(ihn), mutter),praesens)).

% Genitivattribut
loesung(13, chunk,  [chunk(np(pronoun(demo(das)))), chunk(vp(v(ist))),chunk(np(namen(first_name(johns)))), chunk(np(n(freund)))]).
loesung(13, tripel, sein(das, (johns, freund),praesens)).
loesung(14, chunk,  [chunk(np(d(def(die)), n(mutter))), chunk(vp(v(trinkt))),chunk(np(d(def(den)), n(kaffee))),chunk(np(d(def(des)), n(vaters)))]).
loesung(14, tripel, trinken(mutter, (kaffee, vaters),praesens)).

% Praepositionalergaenzung und Akkusativ
loesung(15, chunk,  [chunk(np(d(def(der)), n(vater))), chunk(vp(v(wartet))),chunk(pp(p(auf), np(d(def(den)), n(kaffee))))]).
loesung(15, tripel, warten(vater, auf(kaffee),praesens)).

% Praepositionalergaenzung und Dativ
loesung(16, chunk,  [chunk(np(d(def(der)), n(kaffee))), chunk(vp(v(gehoert))),chunk(pp(p(zu), np(d(def(dem)), n(vater))))]).
loesung(16, tripel, gehoeren(kaffee, zu(vater),praesens)).

% Mehrere Praepositionalergaenzungen
loesung(17, chunk,  [chunk(np(d(def(der)), n(vater))), chunk(vp(v(spricht))),chunk(pp(p(mit), np(d(poss(seinem)), n(sohn)))),chunk(pp(p(ueber), np(adjp(adj(guten)), n(kaffee))))]).
loesung(17, tripel, sprechen(vater, (mit(sohn(seinem)), ueber(kaffee(guten))),praesens)).

% trennbare Verben
loesung(18, chunk,  [chunk(np(d(def(die)), n(familie))) ,chunk(vp(v(kauft))),chunk(np(n(kaffee))), chunk(vp(verbpartikel(ein)))]).
loesung(18, tripel, einkaufen(familie, kaffee,praesens)).

% Perfekt
loesung(19, chunk,  [chunk(np(pronoun(personal(er)))), chunk(vp(v(hat))),chunk(np(d(def(den)), n(kaffee))),chunk(vp(infinit(partizip(gekocht))))]).
loesung(19, tripel, kochen(fw(er), kaffee,perfekt)).

% Praeteritum
loesung(20, chunk,  [chunk(np(pronoun(personal(er)))), chunk(vp(v(ging)))]).
loesung(20, tripel, gehen(fw(er),'_',praeteritum)).

% Plusquamperfekt
loesung(21, chunk,  [chunk(np(pronoun(personal(er)))), chunk(vp(v(hatte))),chunk(np(d(def(den)), n(kaffee))),chunk(vp(infinit(partizip(gekocht))))]).
loesung(21, tripel, kochen(fw(er), kaffee,plusquamperfekt)).

% Futur I
loesung(22, chunk,  [chunk(np(pronoun(personal(er)))), chunk(vp(v(wird))),chunk(np(d(def(den)), n(kaffee))), chunk(vp(infinit(inf(kochen))))]).
loesung(22, tripel, kochen(fw(er), kaffee,futurI)).

% Futur II
loesung(23, chunk,  [chunk(np(pronoun(personal(er)))), chunk(vp(v(wird))),chunk(np(d(def(den)), n(kaffee))),chunk(vp(infinit(partizip(gekocht)))), chunk(vp(infinit(inf(haben))))]).
loesung(23, tripel, kochen(fw(er), kaffee,futurII)).

% fehlende Worte im Lexikon
loesung(24, chunk, [chunk(np(n(vater))),chunk(vp(v(gibt))),chunk(unrecognized_word(tochter)),chunk(np(n(kaffee)))]).
loesung(24, tripel, geben(vater, kaffee, praesens)).

% Rechtschreibfehler
loesung(25, chunk, [chunk(unrecognized_word(mien)),chunk(np(adjp(adj(grosser)), n(bruder))),chunk(unrecognized_word(drinkt)),chunk(np(pronoun(demo(den)))),chunk(unrecognized_word(seer)),chunk(unrecognized_word(hiessen)),chunk(unrecognized_word(seer)),chunk(unrecognized_word(groessen)),chunk(unrecognized_word(swarzen)),chunk(unrecognized_word(kafe))]).
loesung(25, tripel, '_'(bruder(grosser), den,'_')).

loesung(26, chunk, [chunk(unrecognized_word(mien)),chunk(np(adjp(adj(grosser)), n(bruder))), chunk(vp(v(trinkt))),chunk(np(pronoun(demo(den)))),chunk(unrecognized_word(seer)),chunk(unrecognized_word(hiessen)),chunk(unrecognized_word(seer)),chunk(unrecognized_word(groessen)),chunk(unrecognized_word(swarzen)),chunk(unrecognized_word(kafe))]).
loesung(26, tripel, trinken(bruder(grosser), den,praesens)).

% Grammatikfehler
% falsche Diathese
loesung(27, chunk, [chunk(np(pronoun(personal(ich)))),chunk(vp(v(werde))),chunk(partikel(schon)),chunk(vp(infinit(partizip(geholfen))))]).
loesung(27, tripel, geholfen(fw(ich), _, passiv)).
% falscher Kasus
loesung(28, chunk, [chunk(np(pronoun(demo(das)))),chunk(vp(v(liegt))),chunk(pp(p(an),np(d(def(den)),n(winter))))]).
loesung(28, tripel, liegen(das, an(winter), praesens)).
% falscher Genus
loesung(29, chunk, [chunk(np(d(def(das)),n(enkel))),chunk(vp(v(wird))),chunk(np(d(indef(eine)),n(lehrer)))]).
loesung(29, tripel, werden(enkel, lehrer, praesens)).
% falsche Kongruenz
loesung(30, chunk, [chunk(np(d(poss(ihr)),n(enkel))),chunk(vp(v(wirst))),chunk(np(n(lehrer)))]).
loesung(30, tripel, werden(enkel(ihr), lehrer, praesens)).

loesung(31, chunk, [chunk(np(d(poss(ihr)),n(enkel),konjp(konj(und)),d(poss(sein)),n(sohn))),chunk(vp(v(wirst))),chunk(np(n(lehrer)))]).
loesung(31, tripel, werden([enkel(ihr), sohn(sein)], lehrer, praesens)).

% Weglassen von Worten
loesung(32, chunk, [chunk(np(d(poss(mein)), adjp(adj(grosser)), n(bruder))),chunk(vp(v(trinkt))),chunk(np(d(def(den)), adjp(degree(sehr), adj(heissen)),adjp(degree(sehr), adj(schwarzen)), n(kaffee)))]).
loesung(32, tripel, trinken(bruder([mein, grosser]), kaffee([sehr, heissen, sehr, schwarzen]),praesens)).

loesung(33, chunk, [chunk(np(d(poss(mein)), adjp(adj(grosser)), n(bruder))),chunk(vp(v(trinkt))),chunk(np(pronoun(demo(den)))),chunk(partikel(sehr), partikel(sehr)),chunk(np(n(kaffee)))]).
loesung(33, tripel, trinken(bruder([mein, grosser]), (den, kaffee),praesens)).

loesung(34, chunk, [chunk(unrecognized_word(mein)),chunk(vp(v(trinkt))),chunk(np(d(def(den)), n(kaffee)))]).
loesung(34, tripel, trinken(kaffee,'_',praesens)).

loesung(35, chunk, [chunk(np(pronoun(reflex(meiner)))),chunk(vp(v(trinkt))),chunk(np(d(def(den)),n(kaffee)))]).
loesung(35, tripel, trinken(meiner, kaffee,praesens)).

% Nominalphrasen
loesung(36, chunk, [chunk(np(d(def(der)), n(junge)))]).
loesung(36, tripel, '_'(junge,'_','_')).

loesung(37, chunk, [chunk(np(namen(first_name(john), last_name(doe))))]).
loesung(37, tripel, '_'(john_doe,'_','_')).

% Adjektivphrase
loesung(38, chunk, [chunk(adjp(adj(klein)))]).
loesung(38, tripel, 'kein Tripel moeglich').

% Praepositionalphrasen
loesung(39, chunk, [chunk(pp(p(vor), np(d(def(dem)), n(winter))))]).
loesung(39, tripel, '_'('_',vor(winter),'_')).

loesung(40, chunk, [chunk(pp(p1(von), np(d(def(dem)), n(winter)), p2(an)))]).
loesung(40, tripel, '_'('_',von_an(winter),'_')).

loesung(41, chunk, [chunk(pp(np(d(indef(eine)), n(woche)), p(vor),np(d(def(dem)), n(winter))))]).
loesung(41, tripel, '_'('_',vor(woche,winter),'_')).

